#include <iostream>

using namespace std;
// 关键字 typedef 在编译阶段有效，由于是在编译阶段，因此 typedef 有类型检查的功能。
// #define 则是宏定义，发生在预处理阶段，也就是编译之前，它只进行简单而机械的字符串替换，而不进行任何检查。
// 2、功能有差异
// typedef 用来定义类型的别名，定义与平台无关的数据类型，与 struct 的结合使用等。
// #define 不只是可以为类型取别名，还可以定义常量、变量、编译开关等。
// 3、作用域不同
// #define 没有作用域的限制，只要是之前预定义过的宏，在以后的程序中都可以使用。
// 而 typedef 有自己的作用域。
int main()
{
    int i;                   // 定义一个 int 类型的变量 i
    size_t size = sizeof(i); // 用 sizeof 操作得到变量i的类型的大小
    // 这是一个size_t类型的值
    // 可以用来对一个size_t类型的变量做初始化

    i = (int)size;     // size_t 类型的值可以转化为 int 类型的值
    char c = 'a';      // c 保存了字符 a，占一个字节
    wchar_t wc = L'a'; // wc 保存了宽字符 a，占两个字节
    // 注意 'a' 表示字符 a，L'a' 表示宽字符 a

    int arr[] = {1, 2, 3, 4, 5}; // 定义一个数组
    int *p1 = &arr[0];           // 取得数组中元素的地址，赋值给指针
    int *p2 = &arr[3];
    ptrdiff_t diff = p2 - p1; // 指针的减法可以计算两个指针之间相隔的元素个数
    // 所得结果是一个 ptrdiff_t 类型

    i = (int)diff; // ptrdiff_t 类型的值可以转化为 int 类型的值
    cout << "i=" << i << endl;

#define f(x) x *x

    int a = 6, b = 2, c1;
    c1 = f(a) / f(b);
    printf("%d\n", c1);
    return 0;
}